package com.yuntian.service;

import com.yuntian.dto.AccountReceivableDTO;
import com.yuntian.dto.InvoiceCreationResult;
import com.yuntian.dto.InvoiceHeaderDTO;
import com.yuntian.dto.InvoiceDetailDTO;
import com.yuntian.dto.PaymentCustomerDTO;
import com.yuntian.dto.PaymentInvoiceDTO;
import com.yuntian.dto.PaymentResult;

import java.time.LocalDate;
import java.util.List;

public interface OrderService {
    /**
     * 检索处理：根据受注代码获取应收信息，并返回包含必要计算的DTO。
     * @param orderCode 受注代码（半角数字5位）
     * @return AccountReceivableDTO（不存在时返回null）
     */
    AccountReceivableDTO findAccountReceivableByOrderCode(String orderCode);
    /**
     * 登记处理：在事务中更新应收余额与纳入日付。
     * @param orderCode 受注代码
     * @param deliveryDate 纳入日付（省略时为今日）
     * @return 更新后的DTO（反映登记后的应收残高）
     */
    AccountReceivableDTO registerAccountReceivable(String orderCode, LocalDate deliveryDate);

    /**
     * PR20201：需要开票的顾客代码列表（有纳入日付、无发票号）。
     */
    List<String> getCustomersNeedingInvoice();

    /**
     * PR20201：指定顾客的开票处理（生成编号、创建T003、更新T001）。
     */
    InvoiceCreationResult createInvoice(String customerCode, LocalDate requestDate);

    /**
     * PR20202：获取发票头信息。
     */
    InvoiceHeaderDTO getInvoiceHeader(String invoiceNo);

    /**
     * PR20202：获取发票明细（包含税额计算）。
     */
    List<InvoiceDetailDTO> getInvoiceDetails(String invoiceNo);

    // ===== PR20301 入金登録 =====

    /** 候选顾客：存在未入金請求の顧客コード一覧 */
    List<String> getCustomersNeedingPayment();

    /** 顧客情報（名前と現在の売掛残高） */
    PaymentCustomerDTO getPaymentCustomerSummary(String customerCode);

    /** 未入金の請求一覧（顧客別、税込み金額） */
    List<PaymentInvoiceDTO> getUnpaidInvoices(String customerCode);

    /** 入金登録（請求を選択して入金し、顧客残高を減算） */
    PaymentResult registerPayment(String customerCode, LocalDate paymentDate, List<String> invoiceNos);
}